﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SeguradoraIA.Class;
using SeguradoraIA.Diagrama;
using SeguradoraIA.Framework.Log;
using SeguradoraIA.Framework;
using SeguradoraIA.Business;
using System.Data;
using SeguradoraIA.Framework.EnumHelper;

namespace SeguradoraIA.Forms
{
    public partial class Cotacao : PageBase
    {
        #region - Atributos -

        SeguradoraIAEntities ctx = new SeguradoraIAEntities();

        #endregion

        #region - Eventos -

        #region - Page_Load -
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    this.ConfiguraTela();
                }
            }
            catch (Exception ex)
            {
                LogManager.LogException(ex);
                Response.Redirect("~/Forms/PaginaErro.aspx");
            }
        }

        #endregion

        #region - Consultar -
        public override void Consultar()
        {
            try
            {
                PerceptronCODE perceptronCODE = new PerceptronCODE();

                double[] peso = perceptronCODE.RecuperarArrayPeso();

                if (peso == null)
                {
                    ShowAlert("Não existem pesos cadastrados!");
                    return;
                }

                double[] saida = new double[1];

                Perfil perfil = new Perfil();

                int idBairro = this.ddlBairro.SelectedValue.ToInt();
                int idMarcaCarro = this.ddlMarcaCarro.SelectedValue.ToInt();
                int idProfissao = this.ddlProfissao.SelectedValue.ToInt();


                perfil.IdBairro = ctx.DeParaBairro.Where(x => x.IdBairro == idBairro).FirstOrDefault().IdBairro;
                perfil.IdCursoFormacao = this.ddlCursoFormacao.SelectedValue.ToInt();
                //perfil.IdCursoFormacao = ctx.DeParaCursoFormacao.Where(x => x.IdCursoFormacao == this.ddlCursoFormacao.SelectedValue.ToInt()).FirstOrDefault().IdCursoFormacao;
                perfil.IdGrauInstrucao = this.ddlGrauInstrucao.SelectedValue.ToInt();
                perfil.IdMarcaCarro = ctx.DeParaMarcaCarro.Where(x => x.IdMarcaCarro == idMarcaCarro).FirstOrDefault().IdMarcaCarro;
                perfil.IdProfissao = ctx.DeParaProfissao.Where(x => x.ProfissaoIdProfissao == idProfissao).FirstOrDefault().ProfissaoIdProfissao;
                //perfil.IdSinistro = ctx.DeParaSinistro.Where(x => x.IdSinistro == this.ddlSinistro.SelectedValue.ToInt()).FirstOrDefault().IdSinistro;
                perfil.IdSinistro = this.ddlSinistro.SelectedValue.ToInt();
                perfil.IdTipoCarro = this.ddlTipoCarro.SelectedValue.ToInt();
                perfil.IdIdade = this.RecuperaIdade();
                perfil.IdValorCarro = this.RecuperaValorCarro();
                perfil.IdTempoHabilitacao = this.RecuperaTempoHabilitacao();

                List<Perfil> listaPerfil = new List<Perfil>() { perfil };

                var listaCustom = (from x in listaPerfil
                                   select new EntradaDataTable
                                   {
                                       IdBairro = x.IdBairro,
                                       IdCursoFormacao = x.IdCursoFormacao,
                                       IdGrauInstrucao = x.IdGrauInstrucao,
                                       IdIdade = x.IdIdade,
                                       IdMarcaCarro = x.IdMarcaCarro,
                                       IdProfissao = x.IdProfissao,
                                       IdSinistro = x.IdSinistro,
                                       IdTempoHabilitacao = x.IdTempoHabilitacao,
                                       IdTipoCarro = x.IdTipoCarro,
                                       IdValorCarro = x.IdValorCarro,
                                       //Limiar = -1,
                                   }).ToList();

                DataTable dt = Utilities.ListToDataTable<EntradaDataTable>(listaCustom);

                perceptronCODE.calculo_neuronio(ref peso, ref saida, 0, dt);

                EnumDomain.ResultadoEsperadoEnum resultado = Enum<EnumDomain.ResultadoEsperadoEnum>.FromCode(saida[0].ToString());

                Response.Redirect(string.Format("ResultadoCotacao.aspx?IdResultado={0}", resultado.GetHashCode()), false);
            }
            catch (Exception ex)
            {
                LogManager.LogException(ex);
                Response.Redirect("~/Forms/PaginaErro.aspx");
            }
        }
        #endregion

        #endregion

        #region - Metodos -

        #region - ConfiguraTela -
        private void ConfiguraTela()
        {
            this.ucBotoesPadrao.ExibeBotaoConsultar = true;
            this.ucBotoesPadrao.ValidationGroupBtnConsultar = "vgFormulario";
            this.ucBotoesPadrao.ExibirBotoes();

            Utilities.CarregarDDL(this.ddlBairro, ctx.DeParaBairro.ToList(), "Descricao", "IdDeParaBairro", "- Selecione -");
            Utilities.CarregarDDL(this.ddlGrauInstrucao, ctx.GrauInstrucao.ToList(), "Descricao", "IdGrauInstrucao", "- Selecione -");
            Utilities.CarregarDDL(this.ddlMarcaCarro, ctx.DeParaMarcaCarro.ToList(), "Descricao", "IdDeParaMarcaCarro", "- Selecione -");
            Utilities.CarregarDDL(this.ddlProfissao, ctx.DeParaProfissao.ToList(), "Descricao", "IdDeParaProfissao", "- Selecione -");
            Utilities.CarregarDDL(this.ddlSinistro, ctx.Sinistro.ToList(), "Descricao", "IdSinistro", "- Selecione -");
            Utilities.CarregarDDL(this.ddlTipoCarro, ctx.TipoCarro.ToList(), "Descricao", "IdTipoCarro", "- Selecione -");
            Utilities.CarregarDDL(this.ddlCursoFormacao, ctx.CursoFormacao.ToList(), "Descricao", "IdCursoFormacao", "- Selecione -");
        }
        #endregion

        #region - CarregaCampos -
        private void CarregaCampos()
        {
            //Perfil perfil = ctx.Perfil.Where(x => x.IdPerfil == IdPerfil).FirstOrDefault();

            //if (perfil != null)
            //{
            //    //this.txtDescricao.Text = perfil.Descricao;
            //    //this.txtIdade.Text = perfil.ValorIdade.ToString();
            //    //this.txtPesoBairro.Text = perfil.PesoBairro.ToString();
            //    //this.txtPesoCursoFormacao.Text = perfil.PesoCursoFormacao.ToString("N2");
            //    //this.txtPesoGrauInstrucao.Text = perfil.PesoGrauInstrucao.ToString("N2");
            //    //this.txtPesoIdade.Text = perfil.PesoIdade.ToString("N2");
            //    //this.txtPesoMarcaCarro.Text = perfil.PesoMarcaCarro.ToString("N2");
            //    //this.txtPesoProfissao.Text = perfil.PesoProfissao.ToString("N2");
            //    //this.txtPesoSinistro.Text = perfil.PesoSinistro.ToString("N2");
            //    //this.txtPesoTempoHabilitacao.Text = perfil.PesoTempoHabilitacao.ToString("N2");
            //    //this.txtPesoTipoCarro.Text = perfil.PesoTipoCarro.ToString("N2");
            //    //this.txtPesoValorCarro.Text = perfil.PesoValorCarro.ToString("N2");
            //    //this.txtTempoHabilitacao.Text = perfil.AnoTempoHabilitacao.ToString();
            //    //this.txtValorCarro.Text = perfil.NumValorCarro.ToString("N2");
            //    this.ddlBairro.SelectedValue = perfil.IdBairro.ToString();
            //    this.ddlCursoFormacao.SelectedValue = perfil.IdCursoFormacao.ToString();
            //    this.ddlGrauInstrucao.SelectedValue = perfil.IdGrauInstrucao.ToString();
            //    this.ddlMarcaCarro.SelectedValue = perfil.IdMarcaCarro.ToString();
            //    this.ddlProfissao.SelectedValue = perfil.IdProfissao.ToString();
            //    this.ddlSinistro.SelectedValue = perfil.IdSinistro.ToString();
            //    this.ddlTipoCarro.SelectedValue = perfil.IdTipoCarro.ToString();
            //}
        }
        #endregion

        #region - CotarSegurado -
        private void CotarSegurado()
        {
            Perfil perfil = new Perfil();

            //perfil.Descricao = this.txtDescricao.Text.Trim();
            //perfil.PesoBairro = this.txtPesoBairro.Text.ToDouble();
            //perfil.PesoCursoFormacao = this.txtPesoCursoFormacao.Text.ToDouble();
            //perfil.PesoGrauInstrucao = this.txtPesoGrauInstrucao.Text.ToDouble();
            //perfil.PesoIdade = this.txtPesoIdade.Text.ToDouble();
            //perfil.PesoMarcaCarro = this.txtPesoMarcaCarro.Text.ToDouble();
            //perfil.PesoProfissao = this.txtPesoProfissao.Text.ToDouble();
            //perfil.PesoSinistro = this.txtPesoSinistro.Text.ToDouble();
            //perfil.PesoTempoHabilitacao = this.txtPesoTempoHabilitacao.Text.ToDouble();
            //perfil.PesoTipoCarro = this.txtPesoTipoCarro.Text.ToDouble();
            //perfil.PesoValorCarro = this.txtPesoValorCarro.Text.ToDouble();

            perfil.IdBairro = this.ddlBairro.SelectedValue.ToInt();
            perfil.IdCursoFormacao = this.ddlCursoFormacao.SelectedValue.ToInt();
            perfil.IdGrauInstrucao = this.ddlGrauInstrucao.SelectedValue.ToInt();
            perfil.IdMarcaCarro = this.ddlMarcaCarro.SelectedValue.ToInt();
            perfil.IdProfissao = this.ddlProfissao.SelectedValue.ToInt();
            perfil.IdSinistro = this.ddlSinistro.SelectedValue.ToInt();
            perfil.IdTipoCarro = this.ddlTipoCarro.SelectedValue.ToInt();
            perfil.IdIdade = this.RecuperaIdade();
            perfil.IdValorCarro = this.RecuperaValorCarro();
            perfil.IdTempoHabilitacao = this.RecuperaTempoHabilitacao();

            List<double> listaEntrada = new List<double>()
            {
                perfil.IdBairro,
                perfil.IdCursoFormacao,
                perfil.IdGrauInstrucao,
                perfil.IdMarcaCarro,
                perfil.IdProfissao,
                perfil.IdSinistro,
                perfil.IdTipoCarro,
                perfil.IdIdade,
                perfil.IdValorCarro,
                perfil.IdTempoHabilitacao,
            };

            RedeNeural redeNeural = new RedeNeural();
            redeNeural.Classificar(listaEntrada);

            ShowAlert("Registro cadastrado com sucesso", "ConsultarPerfil.aspx");
        }
        #endregion

        #region - Recupera IDs -

        private int RecuperaTempoHabilitacao()
        {
            int numTempoHabilitacao = txtTempoHabilitacao.Text.ToInt();
            TempoHabilitacao tempoHabilitacao = ctx.TempoHabilitacao.Where(x => x.AnoInicial <= numTempoHabilitacao && x.AnoFinal >= numTempoHabilitacao).FirstOrDefault();
            return tempoHabilitacao != null ? tempoHabilitacao.IdTempoHabilitacao : 0;
        }

        private int RecuperaValorCarro()
        {
            double vlrCarro = txtValorCarro.Text.ToDouble();
            vlrCarro = vlrCarro / 1000;
            ValorCarro valorCarro = ctx.ValorCarro.Where(x => x.ValorInicial <= vlrCarro && x.ValorFinal >= vlrCarro).FirstOrDefault();
            return valorCarro != null ? valorCarro.IdValorCarro : 0;
        }

        private int RecuperaIdade()
        {
            int numIdade = txtIdade.Text.ToInt();
            Idade idade = ctx.Idade.Where(x => x.IdadeInicial <= numIdade && x.IdadeFinal >= numIdade).FirstOrDefault();
            return idade != null ? idade.IdIdade : 0;
        }

        #endregion

        #endregion
    }
}